package com.gzr.collection;

import java.util.ArrayList;
import java.util.Iterator;

/**
 * 遍历集合的几种区别-并发修改问题
 *
 */
public class CollectionDemo01 {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("java入门");
        list.add("宁夏枸杞");
        list.add("黑枸杞");
        list.add("人字拖");
        list.add("特级枸杞");
        list.add("西洋参");
        System.out.println(list);


        //需求 删除所有枸杞

        //for循环
/*        for (int i=0;i<list.size();i++) {
            if (list.get(i).contains("枸杞")) {
                list.remove(list.get(i));
            }
        }

        System.out.println(list);*/
        //发现并发修改异常问题

        //解决方案1 用i--
/*        for (int i=0;i<list.size();i++) {
            if (list.get(i).contains("枸杞")) {
                list.remove(list.get(i));
                i--;
            }
        }

        System.out.println(list);*/

        //解决方案2 倒着遍历并删除
/*        for (int i=list.size()-1; i>=0; i--) {
            if (list.get(i).contains("枸杞")) {
                list.remove(list.get(i));
            }
        }

        System.out.println(list);*/

        //解决方案3 迭代器遍历并删除也存在并发修改异常问题
        //解决方式1：使用迭代器的remove方法进行删除
//        Iterator<String> iterator = list.iterator();
//        while (iterator.hasNext()) {
//            if (iterator.next().contains("枸杞")) {
//                iterator.remove();
//            }
//        }
//
//        System.out.println(list);

        //增强for循环和Lambda（都没有办法解决并发修改异常问题）
        //增强for
//        for (String s : list) {
//            if (s.contains("枸杞")) {
//                list.remove(s);
//            }
//        }

        //Lambda
        list.forEach(i->{
            if (i.contains("枸杞")) {
                list.remove(i);
            }
        });
    }
}
